<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>112_可变参数</title>
		<!-- 
			arguments
				- arguments是函数中又一个隐含参数,另外一个是this。
				- arguments是一个类数组对象(伪数组)
					和数组相似，可以通过索引来读取元素，也可以通过for循环变量，
					但是它不是一个数组对象，不能调用数组的方法。
				- arguments用来存储函数的实参，
				- arguments.length 实参个数
				无论用户是否定义形参，实参都会存储到arguments对象中。
				可以通过该对象直接访问实参
		 -->
		<script>
			function fn() {
				console.log(arguments[2]);
				console.log(Array.isArray(arguments)); //false

				//遍历实参
				for (let v of arguments) {
					console.log(v);
				}
			}
			fn(1, "xxx", 11)

			//定义一个函数，可以求任意个数值的和
			//通过arguments，可以不受参数数量的限制更加灵活的创建函数
			//缺点是使用时不一定知道需要传入参数。使用可变参数可以解决这个我问题。
			function sum() {
				let ret = 0;
				for (let arg of arguments) {
					ret = ret + arg;
				}
				return ret;
			}
			let result = sum(1, 3, 35)
			console.log(result);

			/* 
			可变参数，在定义函数时可以将参数指定为可变参数
				可变参数可以接收任意数量实参，并将他们统一存储到一个数组中返回
				- 可变参数的作用和arguments基本是一致，但是也具有一些不同点:
					1.可变参数的名字可以自己指定
					2.可变参数就是一个数组，可以直接使用数组的方法
					3，可变参数可以配合其他参数一起使用
				-当可变参数和普通参数一起使用时，需要将可变参数写到最同。
			 */
			function fn2(...args) {
				console.log(args);
			}
			fn2(1, 2, 3)

			function sum2(...args) {
				return args.reduce((a, b) => a + b)
			}
			ret = sum2(3, 3, 3)
			console.log("sum2=", ret);

			function fn3(a, b, ...args) {
				console.log("fn3",args);
			}
			//第一个参数传给a,第二个参数传给b，其余的才传给可变参数。
			//如果只有2个参数，可变参数则是一个空数组。
			fn3(10,30,"haha",true,this)
		</script>
	</head>
	<body>
	</body>
</html>